package com.opencee.common.utils;

import cn.hutool.system.OsInfo;
import cn.hutool.system.SystemUtil;
import com.lowagie.text.pdf.BaseFont;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import java.awt.*;
import java.io.*;
import java.util.Map;

/**
 * 模板工具类
 *
 * @author yadu
 */
@Slf4j
public class HtmlTemplateUtil {


    private TemplateEngine templateEngine;
    /**
     * 字体目录
     */
    private String fontDir;


    public HtmlTemplateUtil(TemplateEngine templateEngine) {
        this.templateEngine = templateEngine;
        this.fontDir = getDefaultFontDir();
    }

    private String getDefaultFontDir() {
        String fontPath = "";
        OsInfo osInfo = SystemUtil.getOsInfo();
        if (osInfo.isWindows()) {
            fontPath = "C:\\Windows\\Fonts";
        } else if (osInfo.isLinux()) {
            fontPath = "/usr/share/fonts";
        } else if (osInfo.isMac()) {
            fontPath = "/System/Library/Fonts";
        }
        log.info("当前系统:{} x {} 字体库:{}", osInfo.getName(), osInfo.getArch(), fontPath);
        return fontPath;
    }

    /**
     * 生成文件
     * 模板在/src/main/resources/templates 目录下的文件名称
     *
     * @param htmlTemplate   模板文件名称 contract  模板默认所在目录在/src/main/resources/templates
     * @param targetFilePath 生成文件路径 D:/contract.html
     * @param data           模板数据
     */
    public void generateFile(String htmlTemplate, String targetFilePath, Map<String, Object> data) {
        File file = new File(targetFilePath);
        File dir = new File(file.getParent());
        if (!dir.exists() && !dir.isDirectory()) {
            dir.mkdirs();
        }
        try (Writer writer = new FileWriter(file)) {
            Context context = new Context();
            context.setVariables(data);
            this.templateEngine.process(htmlTemplate, context, writer);
        } catch (Exception e) {
        }
    }

    /**
     * 生成html内容
     *
     * @param htmlTemplate 模板文件名称 contract  模板默认所在目录在/src/main/resources/templates
     * @param data         模板数据
     * @return 模板内容 String 类型
     */
    public String generateHtml(String htmlTemplate, Map data) {
        try {
            Context context = new Context();
            context.setVariables(data);
            return this.templateEngine.process(htmlTemplate, context);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }

    }

    /**
     * 生成文件
     * 模板在/src/main/resources/templates 目录下的文件名称
     *
     * @param htmlTemplate   模板文件名称 contract  模板默认所在目录在/src/main/resources/templates
     * @param targetFilePath 生成文件路径 D:/contract.html
     * @param data           模板数据
     */
    public File generatePdf(String htmlTemplate, String targetFilePath, Map<String, Object> data) {
        try {
            String html = generateHtml(htmlTemplate, data);
            return generatePdf(html, targetFilePath);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }


    public File generatePdf(String content, String targetFilePath) throws Exception {
        File file = new File(targetFilePath);
        File dir = new File(file.getParent());
        if (!dir.exists() && !dir.isDirectory()) {
            dir.mkdirs();
        }
        ITextRenderer renderer = new ITextRenderer();
        ITextFontResolver fontResolver = renderer.getFontResolver();
        try {
            //设置字体，否则不支持中文,在html中使用字体，html{ font-family: SimSun;}
            if (!StringUtils.hasText(fontDir)) {
                fontResolver.addFontDirectory(fontDir, BaseFont.NOT_EMBEDDED);
            }
            renderer.setDocumentFromString(content);
            renderer.layout();
            renderer.createPDF(new FileOutputStream(file));
            renderer.finishPDF();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return file;
    }

    public String getFontDir() {
        return fontDir;
    }

    public void setFontDir(String fontDir) {
        this.fontDir = fontDir;
    }
}
